﻿/*
输入：
4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1
输出：
1 1 0 0 0
1 1 0 0 0
0 0 0 0 0
0 0 0 1 1
*/

// N行，M列
string[] NMStrArr = Console.ReadLine().Split(" ");
int N = int.Parse(NMStrArr[0]);
int M = int.Parse(NMStrArr[1]);

// 地图
int[,] map = new int[N,M];
for (int i = 0; i < N; i++)
{
    string[] lines = Console.ReadLine().Split(" ");
    for (int j = 0; j < lines.Length; j++)
    {
        map[i, j] = int.Parse(lines[j]);
    }
}

// 广度优先搜索
void bfs(int[,] map, int ki, int kj)
{
    map[ki, kj] = 2;
    Queue<(int, int)> queue = new Queue<(int, int)>();
    queue.Enqueue((ki, kj));
    while (queue.Count > 0)
    {
        (int i, int j) = queue.Dequeue();
        // 右侧为陆地
        if (j < map.GetLength(1) - 1 && map[i, j+1] == 1)
        {
            map[i, j + 1] = 2;
            queue.Enqueue((i, j + 1));
        }
        // 下侧为陆地
        if (i < map.GetLength(0) - 1 && map[i+1, j] == 1)
        {
            map[i+1, j] = 2;
            queue.Enqueue((i+1, j));
        }
        // 左侧为陆地
        if (j > 0 && map[i, j-1] == 1)
        {
            map[i, j - 1] = 2;
            queue.Enqueue((i, j - 1));
        }
        // 上侧为陆地
        if (i > 0 && map[i-1, j] == 1)
        {
            map[i-1, j] = 2;
            queue.Enqueue((i-1, j));
        }
    }
}

// 剔除边缘岛屿
for (int i = 0; i < N; i++)
{
    // 启动广搜
    if (map[i, 0] == 1)
    {
        bfs(map, i, 0);
    }

    if (map[i, M - 1] == 1)
    {
        bfs(map, i, M - 1);
    }
}
for (int j = 0; j < M; j++)
{
    // 启动广搜
    if (map[0, j] == 1)
    {
        bfs(map, 0, j);
    }

    if (map[N-1, j] == 1)
    {
        bfs(map, N-1, j);
    }
}

// 输出结果
int res = 0;
for (int i = 0; i < N; i++)
{
    for (int j = 0; j < M; j++)
    {
        map[i, j] = map[i, j] > 1 ? 1 : 0;
        
        if(j == M-1) Console.WriteLine($"{map[i,M-1]}");
        else Console.Write($"{map[i,j]} ");
        
    }
    
}